home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
magazyn_amiga
/
5
/
ami043_kurs_arexx.txt
< prev
next >
Wrap
Text File
|
1997-09-16
|
12KB
|
523 lines
AREXX (3)
<lead>Dzisiaj, zgodnie z obietnicâ, zajmiemy sië popularnymi
playerami do moduîów. Postanowiîem opisaê tylko jeden z nich --
HippoPlayer w wersji 2.0. Mój wybór padî na HippoPlayer dlatego,
ûe program ten dziaîa na kaûdej Amidze, nawet na systemie 1.2, na
A500 z "poîówkami". Takûe na tej konfiguracji dostëpny jest port
ARexxa w tym programie -- potrzebny jest tylko RexxMast i
odpowiednie biblioteki.
<a>LeMUr/Fire & blabla
<txt>Na poczâtek jednak czëôê teoretyczna, czyli peîna lista
rozkazów ARexxa, które rozpoznaje nasz grajek. Parametry w
nawiasach ostrych ("<" i ">") sâ konieczne, a te w nawiasach
kwadratowych ("[" i "]") moûna pominâê.
<r>
CHOOSE <num> -- wybranie moduîu numer "num" z listy.
ADD [file] -- dodanie pliku "file" do listy. Jeôli nie podamy nazwy,
to zostanie otwarty requester plików.
DEL -- skasowanie wybranego pliku z listy.
CLEAR -- wyczyszczenie listy moduîów.
MOVE <num> -- przesuniëcie wybranego moduîu za moduî numer "num".
INSERT <file> -- wstawienie pliku "file" za wybranym moduîem.
SORT -- sortowanie listy moduîów.
LOADPRG [file] -- zaîadowanie programu (listy moduîów) o nazwie
"file"; jeôli nie podamy nazwy, to zostanie otwarty requester plików.
PLAY [file] -- wyczyszczenie listy i zaîadowanie pliku "file"
oraz odegranie go. Jeôli nie podamy nazwy, to trzeba plik wybraê
z requestera.
EJECT -- przerwanie odtwarzania granego moduîu.
STOP -- przerwanie odgrywania moduîów.
CONT -- wznowienie odgrywania zatrzymanego przez STOP.
PLAYSONG <num> -- odegranie "songu" numer "num".
RANDPLAY -- wybranie losowego moduîu z listy i odegranie go.
FFWD -- "przewiniëcie" moduîu do przodu.
REW -- przewiniëcie do tyîu.
VOLUME <vol> -- ustawienie gîoônoôci na "vol" w zakresie 0-64.
QUIT -- zamkniëcie wszystkich okien i wyjôcie z programu.
ZIP <0/1> -- 0: zmniejszenie gîównego okna, 1: normalne rozmiary
tego okna.
HIDE <0/1> -- 0: ukrycie gîównego okna, 1: pokazanie go.
PUBSCREEN <screen> -- wszystkie okna i requestery majâ sië pojawiaê
na wskazanym ekranie publicznym (waûna wielkoôê liter!).
TIMEOUT <secs> -- moduî ma byê odgrywany maksymalnie "secs"
sekund (zakres 0-600).
PS3MBOOST <value> -- "podbicie" gîoônoôci w trybie PS3M (zakres 0-8).
PS3MMODE <mode> -- tryb PS3M: 1 -- surround, 2 -- stereo, 3 -- mono,
4 -- real surround, 5 -- 14-bitowe stereo.
PS3MRATE <rate> -- wartoôê "próbkowania" PS3M (zakres 5000-56000, w
hercach).
LOADPREFS <file> -- wgranie nowych preferencji programu.
HippoPlayer zgrywa preferencje do pliku "S:HippoPlayer.prefs",
wiëc najpierw trzeba "rëcznie" skopiowaê plik z innymi
preferencjami niû standardowe (jeûeli jest nam to potrzebne).
GET <xxxx> -- pobranie informacji; "xxxx" ma nastëpujâce znaczenie:
PLAY -- 0, jeôli nic nie jest odgrywane; 1, jeôli coô "gra".
CFIL -- numer wybranego pliku lub 0, gdy nic nie jest wybrane.
NFIL -- liczba plików w liôcie.
CURR -- numer na liôcie aktualnie granego moduîu.
NAME -- nazwa moduîu.
TYPE -- typ moduîu.
CNAM -- nazwa wybranego pliku.
CSNG -- numer aktualnego "songu".
NSNG -- liczba "songów" w module.
CSPO -- pozycja "songu".
MSPO -- maksymalna pozycja "songu".
FNAM -- peîna nazwa granego pliku.
COMM -- komentarz do granego pliku.
SIZE -- rozmiar odgrywanego pliku.
<txt>Jest tego trochë -- bëdzie co omawiaê. Port programu nosi
nazwë HIPPOPLAYER, a jest zakîadany wtedy, gdy zainstalowany
(uruchomiony) jest RexxMast. My, korzystajâc z ARexxa na co
dzieï, nie musimy sië tym przejmowaê. Zgodnie z tym, co
napisaîem w czëôci pierwszej, RexxMast jest uruchamiany przy
kaûdym starcie systemu (jeûeli sobie to zapewnimy dopisujâc
odpowiedniâ linië do user-startup lub przeciâgajâc ikonkë
RexxMast do szuflady WBStartup).
Spróbujmy napisaê skrypt, podajâcy informacje o odgrywanym
module. Oto on:
<l>
/*
Co_gramy.hip
*/
ADDRESS 'HIPPOPLAYER'
OPTIONS RESULTS
/* sprawdzamy, czy coô jest grane */
Get PLAY
IF RESULT==0 THEN
DO
SAY "Nic nie gram, wiëc nie ma o czym mówiê!"
EXIT
END
/* teraz pobieramy interesujâce nas nazwy */
Get NAME
Nazwa=RESULT
Get FNAM
Plik=RESULT
SAY 'Odgrywam moduî "' || Nazwa || '",'
SAY 'który jest plikiem "' || Plik || '"'
/* sprawdzamy rozszerzenie pliku */
Len=Length(Plik)
DO i=Len TO 1 BY -1 WHILE i>0
IF(Substr(Plik,i,1)='.') THEN
BREAK
IF (i=0) THEN
Ext=''
ELSE
Ext=Substr(Plik,i,Len)
/* sprawdzamy, czy plik jest spakowany */
IF (Ext='pp' | Ext='xpk') THEN
Pack=' (po rozpakowaniu).'
ELSE
Pack='.'
END
/* jak duûy jest plik? */
Get SIZE
SAY "Plik ten ma " || RESULT || " bajtów" || Pack
/* co to za moduî? */
Get TYPE
SAY 'Jest to moduî typu "' || RESULT || '"'
EXIT
<txt>Na poczâtek standardowo -- kierujemy wszystko do portu
HippoPlayera i ûâdamy, aby zwracane byîy informacje. Na wstëpie
sprawdzamy, czy w ogóle coô jest grane -- jeôli nie, to nie ma
sensu sprawdzaê innych informacji, wiëc koïczymy program. Jeôli
natomiast "coô" jest odgrywane, to podajemy informacje o module
-- najpierw jego nazwë, a potem peînâ nazwë pliku -- wszystko
zgodnie z powyûszym opisem funkcji. Rozkaz SAY jest rozkazem
samego ARexxa i powoduje wyprowadzenie ciâgu na ekran (coô w
rodzaju BASIC-owego PRINT) -- to tak dla przypomnienia.
Dalsza czëôê jest juû bardziej skomplikowana -- szukamy
rozszerzenia pliku. Jest to rozwiâzane w bardzo prosty sposób --
"maszerujemy" od koïca nazwy pliku i sprawdzamy kaûdy znak. Jeôli
znak ten jest kropkâ ("."), to przerywamy sprawdzanie. Przerwanie
to powoduje wewnëtrzny rozkaz ARexxa -- BREAK. Linië
<l>DO i=Len TO 1 BY -1 WHILE i>0
<txt>moûna przetîumaczyê jako "zmniejszaj i od Len co 1, dopóki i
jest wiëksze od zera". Myôlë, ûe jest to jasne. To rozwiâzanie
daje nam pewnoôê, ûe zostanâ sprawdzone wszystkie znaki,
podâûajâc od koïca nazwy. Po znalezieniu kropki kopiujemy
rozszerzenie do zmiennej "Ext" i sprawdzamy, czy jest ona równa
"pp" lub "xpk" -- dwóm najpopularniejszym rozszerzeniom
spakowanych danych (jeôli ktoô chce, to moûe dodaê swoje wîasne
rozszerzenia, np. "crm"). Jeôli natomiast nie jest to ûadne z
tych rozszerzeï (jeôli plik nosi nazwë "mod.moduî" i nie jest
spakowany, to w zmiennej Ext znajdziemy... "moduî", a nie o to
nam przecieû chodzi), to zmiennej Pack podporzâdkowujemy kropkë.
Jeôli jest inaczej -- napis "(po rozpakowaniu)". Nastëpnie
powracamy do obsîugi HippoPlayera -- sprawdzamy rozmiar pliku i
typ moduîu. Wyprowadzamy oczywiôcie te dane na ekran.
Spróbujcie przerobiê ten skrypt tak, aby dane zamiast do okna
konsoli (np. okna CLI/Shell) zostaîy dopisane do tekstu w
Cygnusie. Dla uîatwienia podam przykîad wstawienia do tekstu
nazwy odtwarzanego moduîu:
<l>
/*
Do_Cygnusa.hip
*/
ADDRESS 'HIPPOPLAYER'
OPTIONS RESULTS
/* pobranie nazwy moduîu */
Get NAME
Nazwa=RESULT
/* "przeîâczenie" sië na Cygnusa */
ADDRESS 'rexx_ced'
/* wypisanie nazwy moduîu */
TEXT Nazwa
EXIT
<txt>Myôlë, ûe nie trzeba dîugo objaôniaê. Najpierw odczytujemy
potrzebne nam dane z HPlayera i przechowujemy je w zmiennych, a
potem kierujemy sië do Cygnusa i "przepisujemy" zmienne do
tekstu.
Czas na wiëkszy skrypt. Tym razem "coô", co pozwala na wczytanie
wszystkich moduîów na listë z podanego katalogu (i ewentualnych
podkatalogów), posortowanie tej listy, a nastëpnie odegranie
moduîów.
<l>
/*
PlayHippo.rexx
*/
PARSE ARG name
/* sprawdzenie parametrów */
IF name=='' THEN
DO
SAY 'Wymagam jednego parametru - nazwy katalogu'
EXIT
END
/* "wyczyszczenie" listy */
ADDRESS 'HIPPOPLAYER'
Stop
Clear
/* stworzenie pliku pomocniczego */
ADDRESS COMMAND "C:List >T:Temp-dir" || name || "LFORMAT %F%S ALL"
i=0
CALL OPEN in,"T:Temp-dir",READ
DO FOREVER
i=i+1
mod.i=READLN(in)
IF EOF(in)==1 THEN
BREAK
END
CALL CLOSE in
ADDRESS COMMAND "C:Delete >NIL: T:Temp-dir"
ADDRESS 'HIPPOPLAYER'
/* dodawanie moduîów do listy */
DO a=1 TO i-1
Add mod.a
END
/* sortowanie listy */
Sort
/* odegranie pierwszego moduîu */
Choose 1
Play
EXIT
<txt>Jest to skrypt, który wymaga podania parametru -- katalogu, z
którego chcemy odgrywaê moduîy. Aby pobraê jakâô wartoôê
przekazanâ jako parametr, naleûy uûyê PARSE ARG. Sam rozkaz PARSE
jest bardzo rozbudowany i moûe poôwiëcë mu jeden z odcinków -- na
razie wystarczy wiedzieê, ûe "PARSE ARG arg1 arg2 ..." powoduje
zapisanie kolejnych parametrów w zmiennych arg1, arg2 itd.
Po pobraniu parametrów sprawdzamy, czy w ogóle jakieô sâ (ARexx
przekaûe pusty ciâg do zmiennej, jeôli nie podamy parametru).
Jeôli nie ma, to wychodzimy ze skryptu. Jeûeli natomiast
podaliômy jakâô nazwë, to zatrzymujemy moduî w HippoPlayerze i
czyôcimy listë. Nastëpnie tworzymy plik pomocniczy, w którym
zostajâ zapisane nazwy plików z wybranego przez nas katalogu.
Pomocna jest tutaj komenda AmigaDOS-u C:LIST, której opis moûna
znaleúê w cyklu "System na talerzu".
Po "wylistowaniu" katalogu pozostaje tylko zapamiëtaê wszystkie
nazwy i przekazaê je do HippoPlayera. Wykorzystujemy do tego
tablice. W ARexxie nie ma ograniczenia wielkoôci tablic, nie
trzeba ich teû deklarowaê. Wystarczy, ûe zapiszemy coô do n-tego
elementu tablicy tab przez "tab.n" i to coô juû tam bëdzie. W
naszym skrypcie zapisujemy do tablicy "mod" nazwy kolejnych
moduîów (konkretnie -- nazwy plików). Jeôli napotkamy przy
czytaniu (funkcja ARexxa READLN()) na koniec pliku (jeûeli jest
to prawdâ, to funkcja ARexxa EOF() zwróci nam wartoôê 1), to
przerywamy uzupeînianie tablicy. Kasujemy teû plik pomocniczy.
Potem zwracamy sië znowu do HippoPlayera i przepisujemy dane z
tablicy "mod" do listy moduîów. Na koniec sortujemy caîâ listë,
ustawiamy sië na pierwszym module i zaczynamy koncert!
Powyûszy skrypt ma jednak wadë -- jeôli w danym katalogu znajdzie
sië podkatalog, to jego nazwa takûe zostanie dopisana do listy.
HippoPlayer przy próbie wczytania tego "pliku" (bëdzie to
oczywiôcie niemoûliwe -- jak wczytaê katalog?) zasygnalizuje
bîâd, lecz odtwarzanie listy bëdzie trwaîo nadal. Jeôli w tym
katalogu znajdâ sië jakieô moduîy (lub inne pliki -- skrypt nie
sprawdza, czy ma do czynienia z moduîem!), to one takûe zostanâ
doîâczone do listy. Moûna to zmieniê, usuwajâc opcjë ALL w
wywoîaniu "C:List".
Jako pracë domowâ proponujë rozbudowë skryptu "PlayHippo.rexx".
Dodajcie sprawdzanie, czy HippoPlayer jest uruchomiony i
ewentualnie uruchomcie go (przydatny bëdzie pierwszy odcinek
tego kursu...). Po takiej zmianie warto dodaê atrybut "S(cript)"
do pliku i umieôciê go w katalogu REXX:. Pozwoli to na îatwe
odtwarzanie caîych katalogów z moduîami -- wystarczy w CLI/Shell
wpisaê np. "PlayHippo.rexx DH2:Mods".
I jeszcze jeden skrypt -- tym razem nie zwiâzany z HippoPlayerem.
Jest to skrypt liczâcy sumë liczb, zapisanych w pliku tekstowym.
Przyda sië osobom, które robiâ katalogi zawierajâce dîugoôê
danych. Aby policzyê caîkowitâ dîugoôê tych danych, wystarczy
zapisaê wszystkie liczby w pliku i uruchomiê poniûszy skrypt. Ma
on jednak pewnâ wadë -- ostatnia linia nie moûe byê zakoïczona (w
Cygnusie: kwadrat symbolizujâcy kursor ma byê na koïcu ostatniej
linii, a nie pod niâ, na poczâtku kolejnej).
<l>
/*
Suma.rexx
*/
PARSE ARG nazwa
IF nazwa='' THEN
EXIT
CALL OPEN in,nazwa,READ
suma=0
/* liczenie sumy */
DO UNTIL EOF(in)
bug=READLN(in)
suma=suma+bug
END
CALL CLOSE in
SAY suma
<txt>Na wstëpie sprawdzamy parametry. Nastëpnie otwieramy wybrany
plik do odczytu. Kolejna sprawa to pëtla "krëcâca" sië tak dîugo,
dopóki nie zostanie osiâgniëty koniec pliku. Jednoczeônie
odczytywane sâ kolejne linie i dodawane sâ ich wartoôci do sumy.
Na koniec zamykamy plik i wyprowadzamy wynik.
To wszystko w tym odcinku. W nastëpnym zajmiemy sië... to
niespodzianka!
<przyp>
Literatura:
ARexx Guide 2.0 -- "biblia" ARexxa opisujâca wszystkie jego
funkcje i skîadnië poszczególnych rozkazów jëzyka.
Serdecznie dziëkujë Marcinowi Ochockiemu za pomoc w pisaniu
artykuîu.